# ①　从keras中导入layers, losses, optimizers, Sequential模块
import matplotlib.pyplot as plt
from keras import layers, losses, optimizers, Sequential, activations, models
# ②　使用numpy的loadtxt函数加载名为'data-01-test-score.csv'的文件，并以','为分隔符
import numpy as np

data = np.loadtxt('data-01-test-score.csv', delimiter=',')
# ③　从data中取出所有行以及倒数第二列之前的所有列作为输入数据x_data
x_data = data[:, :-1]
# ④　从data中取出所有行以及最后一列作为输出数据y_data
y_data = data[:, -1:]
# ⑤　从sklearn.model_selection模块中导入train_test_split函数
from sklearn.preprocessing import StandardScaler

stand = StandardScaler().fit(x_data)
x_data = stand.transform(x_data)
from sklearn.model_selection import train_test_split

# ⑥　使用train_test_split函数划分训练集和测试集，其中训练集占总数据的70%
X_train, X_test, y_train, y_test = train_test_split(x_data, y_data, train_size=0.7)
# ⑦　创建一个Sequential模型
# ⑧　添加具有4个神经元和relu激活函数的全连接层
# ⑨　添加具有1个神经元的全连接层
model = Sequential([
    layers.Dense(units=4, activation=activations.relu),
    layers.Dense(units=1)
])
# ⑩　编译模型，使用RMSprop优化器，MSE损失函数
model.compile(optimizer=optimizers.RMSprop(), loss=losses.mse, metrics="mse")
# 11　对模型进行训练，共进行2000个epoch，并将训练过程保存在log中
log = model.fit(X_train, y_train, epochs=2000)
# 12　打印模型的结构信息
print(model.summary())
# 13　打印训练过程中记录的损失值
print(log.history['loss'])
# 14　打印训练过程中记录的均方误差值
print(log.history['mse'])
# 15　使用训练好的模型对测试集进行预测
predict = model.predict(X_test)
# 16　绘制预测结果的曲线，颜色为红色
plt.plot(predict, c='r')
# 17　绘制真实数值的曲线，颜色为绿色
plt.plot(y_test, c='g')
# 18　显示图像
plt.show()
model.save('zpfl.h5')
